From b4a842e00ff3357e63210168f389a92bfd493e57 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 12 Feb 2009 10:54:17 +0000 Subject: [PATCH] vtd: move the snoop control detection out of acpi_dmar_init() where the capability value is not initialized thus we may get random value. Signed-off-by: Xin, Xiaohui --- xen/drivers/passthrough/vtd/dmar.c | 19 +------------------ xen/drivers/passthrough/vtd/iommu.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/xen/drivers/passthrough/vtd/dmar.c b/xen/drivers/passthrough/vtd/dmar.c index 8df7b006cd..946ade0101 100644 --- a/xen/drivers/passthrough/vtd/dmar.c +++ b/xen/drivers/passthrough/vtd/dmar.c @@ -519,8 +519,6 @@ static int __init acpi_parse_dmar(struct acpi_table_header *table) int acpi_dmar_init(void) { int rc; - struct acpi_drhd_unit *drhd; - struct iommu *iommu; rc = -ENODEV; if ( force_iommu ) @@ -537,22 +535,7 @@ int acpi_dmar_init(void) if ( list_empty(&acpi_drhd_units) ) goto fail; - /* Giving that all devices within guest use same io page table, - * enable snoop control only if all VT-d engines support it. - */ - if ( iommu_snoop ) - { - for_each_drhd_unit ( drhd ) - { - iommu = drhd->iommu; - if ( !ecap_snp_ctl(iommu->ecap) ) { - iommu_snoop = 0; - break; - } - } - } - - printk("Intel VT-d has been enabled, snoop_control=%d.\n", iommu_snoop); + printk("Intel VT-d has been enabled\n"); return 0; diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 7bc680eed8..9aaa6400a8 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1765,6 +1765,23 @@ int intel_vtd_setup(void) if ( init_vtd_hw() ) goto error; + /* Giving that all devices within guest use same io page table, + * enable snoop control only if all VT-d engines support it. + */ + + if ( iommu_snoop ) + { + for_each_drhd_unit ( drhd ) + { + iommu = drhd->iommu; + if ( !ecap_snp_ctl(iommu->ecap) ) { + iommu_snoop = 0; + break; + } + } + } + + printk("Intel VT-d snoop control %sabled\n", iommu_snoop ? "en" : "dis"); register_keyhandler('V', dump_iommu_info, "dump iommu info"); return 0; @@ -1773,6 +1790,7 @@ int intel_vtd_setup(void) for_each_drhd_unit ( drhd ) iommu_free(drhd); vtd_enabled = 0; + iommu_snoop = 0; return -ENOMEM; } -- 2.30.2